using System.Runtime.InteropServices;
using System.Windows;
using Microsoft.Win32;
using MiniTheme.Models;
using MiniTheme.Services.Interfaces;

namespace MiniTheme.Services;

// 主题服务实现，负责主题的应用和切换
public class ThemeService : IThemeService
{   
    // 当前主题模式
    private ThemeMode _currentMode;  
    private readonly IConfigService _configService;
    public ThemeService(IConfigService configService)
    {
        _configService = configService;
        // 从配置文件加载保存的主题模式
        var savedMode = _configService.GetThemeMode();
        // string格式化Enum如果成功取出就返回配置文件的Mode，否则就返回Auto
        _currentMode = Enum.TryParse<ThemeMode>(savedMode, out var mode) ? mode : ThemeMode.Auto;
    }
    // 应用指定的主题模式
    public void ApplyTheme(ThemeMode mode)
    {
        _currentMode = mode;
        // 将修改同步到配置文件
        _configService.SetThemeMode(mode.ToString());  
        // 如果是Auto模式，先根据注册值判断一次系统主题，根据系统主题决定实际使用的主题
        var actualTheme = mode == ThemeMode.Auto
            ? (IsSystemInDarkMode() ? ThemeMode.Dark : ThemeMode.Light)
            : mode;
        ApplyThemeResources(actualTheme);  // 应用主题资源
    }
    // 获取当前主题模式
    public ThemeMode GetCurrentThemeMode()
    {
        return _currentMode;
    }
    // 检测系统是否处于暗色模式
    public bool IsSystemInDarkMode()
    {
        try
        {
            // 从注册表读取系统主题设置
            using var key = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Themes\Personalize");
            var value = key?.GetValue("AppsUseLightTheme");
            if (value is int intValue)
            {
                return intValue == 0;  // 0=暗色模式, 1=亮色模式
            }
        }
        catch
        {
            // 读取失败时默认返回亮色模式
        }
        return false;
    }
    // 应用主题资源字典到应用程序
    private void ApplyThemeResources(ThemeMode theme)
    {
        // 根据主题确定资源文件名
        var themeName = theme == ThemeMode.Dark ? "DarkTheme.xaml" : "LightTheme.xaml";
        var themeUri = new Uri($"Themes/{themeName}", UriKind.Relative);
        var resources = Application.Current.Resources;
        // 移除已存在的主题资源字典
        var existingDictionary = resources.MergedDictionaries
            .FirstOrDefault(d => d.Source?.OriginalString.Contains("Theme.xaml") == true);
        if (existingDictionary != null)
        {
            resources.MergedDictionaries.Remove(existingDictionary);
        }
        // 添加新的主题资源字典
        var newDictionary = new ResourceDictionary { Source = themeUri };
        resources.MergedDictionaries.Add(newDictionary);
    }
}
